/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * CostosBeneficiosJInternalFrame.java
 *
 * Created on 05-19-2010, 11:06:23 PM
 */
package jepi.ui;

import db.MySQLManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.SpinnerNumberModel;
import javax.swing.table.DefaultTableModel;
import jepi.CostoBeneficioProyecto;
import jepi.Proyecto;
import validadores.api.GrupoValidador;
import validadores.validadoresformato.DoubleValidador;
import validadores.validadoresformato.StringValidador;

/**
 *
 * @author Steve
 */
public class CostosBeneficiosJInternalFrame extends javax.swing.JInternalFrame {

    private Proyecto proyectoActual;
    GrupoValidador validadorCosto = new GrupoValidador();
    GrupoValidador validadorBeneficio = new GrupoValidador();

    /** Creates new form CostosBeneficiosJInternalFrame */
    public CostosBeneficiosJInternalFrame() {
        initComponents();
        nombreCostoValidador.configurarValidacion(nombreCostoTextField, true, "Nombre de costo no puede quedar vacio",
                new StringValidador("Ingrese el nombre del costo", 0, "Nombre de costo no puede quedar vacio"));
        montoCostoValidador.configurarValidacion(montoCostoTextField, true, "Debe especificar el monto del costo",
                new DoubleValidador("Ingrese el monto del costo", DoubleValidador.CONFIGURACIONES.POSITIVO, "Monto debe ser dato numerico"));
        validadorCosto.add(nombreCostoValidador, montoCostoValidador);

        nombreBeneficioValidador.configurarValidacion(nombreBeneficioTextField, true, "Nombre de beneficio no puede quedar vacio",
                new StringValidador("Ingrese el nombre del beneficio", 0, "Nombre de beneficio no puede quedar vacio"));
        montoBeneficioValidador.configurarValidacion(montoBeneficioTextField, true, "Debe especificar el monto del beneficio",
                new DoubleValidador("Ingrese el monto del benefico", DoubleValidador.CONFIGURACIONES.POSITIVO, "Monto debe ser dato numerico"));
        validadorBeneficio.add(nombreBeneficioValidador, montoBeneficioValidador);
    }

    public Proyecto getProyectoActual() {
        return proyectoActual;
    }

    public void setProyectoActual(Proyecto proyectoActual) {
        this.proyectoActual = proyectoActual;
        proyectoSeleccionadoLabel.setText(proyectoActual.getNombre());
        periodoCostoSpinner.setModel(new SpinnerNumberModel(1, 1, proyectoActual.getVidaEconomica(), 1));
        periodoBeneficioSpinner.setModel(new SpinnerNumberModel(1, 1, proyectoActual.getVidaEconomica(), 1));
        actualizarTabla(true);
        actualizarTabla(false);
    }

    public void actualizarTabla(boolean esCosto) {
        String sql = "SELECT * FROM costo_beneficio_proyecto "
                + " WHERE id_proyecto=" + proyectoActual.getIdProyecto()
                + " and es_costo= " + (esCosto ? 1 : 0)
                + " order by  descripcion,periodo";
        try {
            int ncostos = MySQLManager.contarRegistros("select distinct descripcion from costo_beneficio_proyecto "
                    + "where es_costo=" + (esCosto ? 1 : 0) + " and id_proyecto=" + proyectoActual.getIdProyecto());
            ResultSet rs = MySQLManager.ejecutarConsultaSelect(sql);

            String unidadTiempo = MySQLManager.ejecutarConsultaSelect("select cut.descripcion as descrip from proyecto p "
                    + "inner join catalogo_unidad_tiempo cut on p.id_unidad_tiempo=cut.id_unidad_tiempo "
                    + "where p.id_proyecto=" + proyectoActual.getIdProyecto(), true).getString("descrip");

            Object[][] datos = new Object[ncostos][proyectoActual.getVidaEconomica() + 1];
            Object cols[] = new String[proyectoActual.getVidaEconomica() + 1];

            rs.next();
            for (int i = 0; i < ncostos; i++) {
                datos[i][0] = rs.getString("descripcion");
                cols[0] = (esCosto ? "Costo" : "Beneficio");
                for (int j = 0; j < proyectoActual.getVidaEconomica(); j++) {
                    cols[j + 1] = unidadTiempo + " " + (j + 1);
                    if (!rs.isAfterLast() && rs.getInt("periodo") == j + 1 && rs.getString("descripcion").compareTo(datos[i][0].toString()) == 0) {
                        datos[i][j + 1] = String.valueOf(rs.getFloat("monto"));
                        rs.next();
                    } else {
                        datos[i][j + 1] = "0";
                    }
                }
            }
            if (esCosto) {
                costoTable.setModel(new NoEditableTableModel(datos, cols));

            } else {
                beneficioTable.setModel(new NoEditableTableModel(datos, cols));
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        buscarButton = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        proyectoSeleccionadoLabel = new javax.swing.JLabel();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        costosPanel = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        costoTable = new db.TableFromSQL(MySQLManager.getConexionEstatica());
        jLabel2 = new javax.swing.JLabel();
        montoCostoTextField = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        agregarCostoButton = new javax.swing.JButton();
        montoCostoValidador = new validadores.api.ValidadorJTextComponent();
        jLabel4 = new javax.swing.JLabel();
        nombreCostoTextField = new javax.swing.JTextField();
        nombreCostoValidador = new validadores.api.ValidadorJTextComponent();
        periodoCostoSpinner = new javax.swing.JSpinner();
        anualidadCostoCheckBox = new javax.swing.JCheckBox();
        limpiarCostoButton = new javax.swing.JButton();
        jLabel8 = new javax.swing.JLabel();
        eliminarCostoTodosButton = new javax.swing.JButton();
        eliminarCostoButton = new javax.swing.JButton();
        modificarCostoButton = new javax.swing.JButton();
        beneficiosPanel = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        beneficioTable = new db.TableFromSQL();
        jLabel5 = new javax.swing.JLabel();
        montoBeneficioTextField = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        agregarBeneficioButton = new javax.swing.JButton();
        montoBeneficioValidador = new validadores.api.ValidadorJTextComponent();
        jLabel7 = new javax.swing.JLabel();
        nombreBeneficioTextField = new javax.swing.JTextField();
        nombreBeneficioValidador = new validadores.api.ValidadorJTextComponent();
        periodoBeneficioSpinner = new javax.swing.JSpinner();
        anualidadBeneficioCheckBox = new javax.swing.JCheckBox();
        limpiarBeneficioButton = new javax.swing.JButton();
        eliminarBeneficioTodosButton = new javax.swing.JButton();
        eliminarBeneficioButton = new javax.swing.JButton();
        modificarBeneficioButton = new javax.swing.JButton();
        jLabel9 = new javax.swing.JLabel();

        setClosable(true);
        setIconifiable(true);
        setMaximizable(true);
        setResizable(true);
        setTitle("Costos y Beneficios");

        jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        buscarButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/buscar.png"))); // NOI18N
        buscarButton.setText("Seleccionar Proyecto");
        buscarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscarButtonActionPerformed(evt);
            }
        });
        jPanel1.add(buscarButton);

        jLabel1.setText("Proyecto Seleccionado:");
        jPanel1.add(jLabel1);

        proyectoSeleccionadoLabel.setFont(new java.awt.Font("Tahoma", 1, 12));
        proyectoSeleccionadoLabel.setText("    ");
        jPanel1.add(proyectoSeleccionadoLabel);

        getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

        costoTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null}
            },
            new String [] {
                "Costo", "Monto"
            }
        ));
        costoTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                costoTableMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(costoTable);

        jLabel2.setText("Monto");

        jLabel3.setText("Periodo");

        agregarCostoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/create.png"))); // NOI18N
        agregarCostoButton.setText("Agregar Costo");
        agregarCostoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                agregarCostoButtonActionPerformed(evt);
            }
        });

        jLabel4.setText("Costo");

        anualidadCostoCheckBox.setText("Aplicar a todos los periodos");

        limpiarCostoButton.setText("Limpiar Formulario");
        limpiarCostoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                limpiarCostoButtonActionPerformed(evt);
            }
        });

        jLabel8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/tip.png"))); // NOI18N
        jLabel8.setText("Tip: Presione doble click sobre un costo para editar su valor");

        eliminarCostoTodosButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/delete.png"))); // NOI18N
        eliminarCostoTodosButton.setText("Eliminar para todos los periodos");
        eliminarCostoTodosButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarCostoTodosButtonActionPerformed(evt);
            }
        });

        eliminarCostoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/delete.png"))); // NOI18N
        eliminarCostoButton.setText("Eliminar");
        eliminarCostoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarCostoButtonActionPerformed(evt);
            }
        });

        modificarCostoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/modify.png"))); // NOI18N
        modificarCostoButton.setText("Modificar");
        modificarCostoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                modificarCostoButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout costosPanelLayout = new javax.swing.GroupLayout(costosPanel);
        costosPanel.setLayout(costosPanelLayout);
        costosPanelLayout.setHorizontalGroup(
            costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(costosPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(costosPanelLayout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 764, Short.MAX_VALUE)
                        .addContainerGap())
                    .addGroup(costosPanelLayout.createSequentialGroup()
                        .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel4)
                            .addComponent(jLabel3))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(costosPanelLayout.createSequentialGroup()
                                .addComponent(nombreCostoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 254, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(nombreCostoValidador, javax.swing.GroupLayout.PREFERRED_SIZE, 293, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(costosPanelLayout.createSequentialGroup()
                                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(periodoCostoSpinner)
                                    .addComponent(montoCostoTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 95, Short.MAX_VALUE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(montoCostoValidador, javax.swing.GroupLayout.DEFAULT_SIZE, 452, Short.MAX_VALUE)
                                    .addComponent(anualidadCostoCheckBox))))
                        .addGap(44, 44, 44))
                    .addGroup(costosPanelLayout.createSequentialGroup()
                        .addComponent(agregarCostoButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(limpiarCostoButton)
                        .addContainerGap(502, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, costosPanelLayout.createSequentialGroup()
                        .addComponent(jLabel8, javax.swing.GroupLayout.DEFAULT_SIZE, 331, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(modificarCostoButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(eliminarCostoButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(eliminarCostoTodosButton)
                        .addContainerGap())))
        );

        costosPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {agregarCostoButton, limpiarCostoButton});

        costosPanelLayout.setVerticalGroup(
            costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(costosPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(nombreCostoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(nombreCostoValidador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel2)
                        .addComponent(montoCostoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(montoCostoValidador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(periodoCostoSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(anualidadCostoCheckBox))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(agregarCostoButton)
                    .addComponent(limpiarCostoButton))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 233, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(costosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(eliminarCostoTodosButton)
                    .addComponent(eliminarCostoButton)
                    .addComponent(modificarCostoButton, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8))
                .addContainerGap())
        );

        costosPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {agregarCostoButton, limpiarCostoButton});

        jTabbedPane1.addTab("Costos", costosPanel);

        beneficioTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null}
            },
            new String [] {
                "Costo", "Monto"
            }
        ));
        beneficioTable.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                beneficioTableMouseClicked(evt);
            }
        });
        jScrollPane2.setViewportView(beneficioTable);

        jLabel5.setText("Monto");

        jLabel6.setText("Periodo");

        agregarBeneficioButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/create.png"))); // NOI18N
        agregarBeneficioButton.setText("Agregar Beneficio");
        agregarBeneficioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                agregarBeneficioButtonActionPerformed(evt);
            }
        });

        jLabel7.setText("Beneficio");

        anualidadBeneficioCheckBox.setText("Aplicar a todos los periodos");

        limpiarBeneficioButton.setText("Limpiar Formulario");
        limpiarBeneficioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                limpiarBeneficioButtonActionPerformed(evt);
            }
        });

        eliminarBeneficioTodosButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/delete.png"))); // NOI18N
        eliminarBeneficioTodosButton.setText("Eliminar para todos los periodos");
        eliminarBeneficioTodosButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarBeneficioTodosButtonActionPerformed(evt);
            }
        });

        eliminarBeneficioButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/delete.png"))); // NOI18N
        eliminarBeneficioButton.setText("Eliminar");
        eliminarBeneficioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarBeneficioButtonActionPerformed(evt);
            }
        });

        modificarBeneficioButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/modify.png"))); // NOI18N
        modificarBeneficioButton.setText("Modificar");
        modificarBeneficioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                modificarBeneficioButtonActionPerformed(evt);
            }
        });

        jLabel9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/tip.png"))); // NOI18N
        jLabel9.setText("Tip: Presione doble click sobre un costo para editar su valor");

        javax.swing.GroupLayout beneficiosPanelLayout = new javax.swing.GroupLayout(beneficiosPanel);
        beneficiosPanel.setLayout(beneficiosPanelLayout);
        beneficiosPanelLayout.setHorizontalGroup(
            beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(beneficiosPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(beneficiosPanelLayout.createSequentialGroup()
                        .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel7)
                            .addComponent(jLabel6))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(beneficiosPanelLayout.createSequentialGroup()
                                .addComponent(nombreBeneficioTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 254, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(nombreBeneficioValidador, javax.swing.GroupLayout.PREFERRED_SIZE, 293, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(beneficiosPanelLayout.createSequentialGroup()
                                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(periodoBeneficioSpinner)
                                    .addComponent(montoBeneficioTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 95, Short.MAX_VALUE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(anualidadBeneficioCheckBox)
                                    .addComponent(montoBeneficioValidador, javax.swing.GroupLayout.DEFAULT_SIZE, 452, Short.MAX_VALUE))))
                        .addGap(44, 44, 44))
                    .addGroup(beneficiosPanelLayout.createSequentialGroup()
                        .addComponent(agregarBeneficioButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(limpiarBeneficioButton)
                        .addContainerGap(478, Short.MAX_VALUE))
                    .addGroup(beneficiosPanelLayout.createSequentialGroup()
                        .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 764, Short.MAX_VALUE)
                            .addGroup(beneficiosPanelLayout.createSequentialGroup()
                                .addComponent(jLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, 331, Short.MAX_VALUE)
                                .addGap(10, 10, 10)
                                .addComponent(modificarBeneficioButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(eliminarBeneficioButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(eliminarBeneficioTodosButton)))
                        .addContainerGap())))
        );

        beneficiosPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {agregarBeneficioButton, limpiarBeneficioButton});

        beneficiosPanelLayout.setVerticalGroup(
            beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(beneficiosPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel7)
                    .addComponent(nombreBeneficioTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(nombreBeneficioValidador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel5)
                        .addComponent(montoBeneficioTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(montoBeneficioValidador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(periodoBeneficioSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(anualidadBeneficioCheckBox))
                .addGap(13, 13, 13)
                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(agregarBeneficioButton)
                    .addComponent(limpiarBeneficioButton))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 224, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(beneficiosPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel9)
                    .addComponent(eliminarBeneficioTodosButton)
                    .addComponent(eliminarBeneficioButton)
                    .addComponent(modificarBeneficioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(11, 11, 11))
        );

        beneficiosPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {agregarBeneficioButton, limpiarBeneficioButton});

        jTabbedPane1.addTab("Beneficios", beneficiosPanel);

        getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void buscarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscarButtonActionPerformed
        BuscarProyectoJDialog bpd = new BuscarProyectoJDialog(null, true);
        bpd.setVisible(true);
        if (bpd.getReturnStatus() == BuscarProyectoJDialog.RET_OK) {
            setProyectoActual(bpd.getProyectoSeleccionado());
        }
    }//GEN-LAST:event_buscarButtonActionPerformed

    private void agregarCostoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_agregarCostoButtonActionPerformed
        if (validadorCosto.validar()) {
            CostoBeneficioProyecto cbp = new CostoBeneficioProyecto();
            cbp.setIdProyecto(proyectoActual.getIdProyecto());
            cbp.setPeriodo(Integer.parseInt(periodoCostoSpinner.getValue().toString()));
            cbp.setDescripcion(nombreCostoTextField.getText());
            cbp.setMonto(Float.parseFloat(montoCostoTextField.getText()));
            cbp.setEsCosto(true);
            if (anualidadCostoCheckBox.isSelected()) {
                for (int i = 1; i <= proyectoActual.getVidaEconomica(); i++) {
                    cbp.setPeriodo(i);
                    cbp.guardar();
                }
            } else {
                cbp.guardar();
            }
            actualizarTabla(true);
            limpiarCostoButtonActionPerformed(null);
            JOptionPane.showMessageDialog(null, "Se a ingresado el costo satisfactoriamente");
        }
    }//GEN-LAST:event_agregarCostoButtonActionPerformed

    private void agregarBeneficioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_agregarBeneficioButtonActionPerformed
        if (validadorBeneficio.validar()) {
            CostoBeneficioProyecto cbp = new CostoBeneficioProyecto();
            cbp.setIdProyecto(proyectoActual.getIdProyecto());
            cbp.setPeriodo(Integer.parseInt(periodoBeneficioSpinner.getValue().toString()));
            cbp.setDescripcion(nombreBeneficioTextField.getText());
            cbp.setMonto(Float.parseFloat(montoBeneficioTextField.getText()));
            cbp.setEsCosto(false);
            if (anualidadBeneficioCheckBox.isSelected()) {
                for (int i = 1; i <= proyectoActual.getVidaEconomica(); i++) {
                    cbp.setPeriodo(i);
                    cbp.guardar();
                }
            } else {
                cbp.guardar();
            }
            actualizarTabla(false);
            limpiarBeneficioButtonActionPerformed(null);
            JOptionPane.showMessageDialog(null, "Se a ingresado el beneficio satisfactoriamente");
        }
    }//GEN-LAST:event_agregarBeneficioButtonActionPerformed

    private void costoTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_costoTableMouseClicked
        if (evt.getClickCount() == 2) {
            modificarCostoButtonActionPerformed(null);
        }
    }//GEN-LAST:event_costoTableMouseClicked

    private void limpiarCostoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_limpiarCostoButtonActionPerformed
        nombreCostoTextField.setText("");
        montoCostoTextField.setText("");
        periodoCostoSpinner.setValue(1);
        anualidadCostoCheckBox.setSelected(false);
        nombreCostoValidador.cambiarEstadoInicial();
        montoCostoValidador.cambiarEstadoInicial();
        nombreCostoTextField.setEnabled(true);
    }//GEN-LAST:event_limpiarCostoButtonActionPerformed

    private void beneficioTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_beneficioTableMouseClicked
        if (evt.getClickCount() == 2) {
            modificarBeneficioButtonActionPerformed(null);
        }
    }//GEN-LAST:event_beneficioTableMouseClicked

    private void limpiarBeneficioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_limpiarBeneficioButtonActionPerformed
        nombreBeneficioTextField.setText("");
        montoBeneficioTextField.setText("");
        periodoBeneficioSpinner.setValue(1);
        anualidadBeneficioCheckBox.setSelected(false);
        nombreBeneficioValidador.cambiarEstadoInicial();
        montoBeneficioValidador.cambiarEstadoInicial();
        nombreBeneficioTextField.setEnabled(true);
    }//GEN-LAST:event_limpiarBeneficioButtonActionPerformed

    private void eliminarCostoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarCostoButtonActionPerformed
        int fila = costoTable.getSelectedRow();
        int columna = costoTable.getSelectedColumn();
        if (fila >= 0 && columna > 0) {
            int resp = JOptionPane.showConfirmDialog(null, "¿Realmente desea eliminar el costo para el periodo seleccionado?", "Confirmacion de Eliminacion", JOptionPane.YES_NO_OPTION);
            if (resp == JOptionPane.YES_OPTION) {
                CostoBeneficioProyecto cbp = new CostoBeneficioProyecto();
                cbp.setIdProyecto(proyectoActual.getIdProyecto());
                cbp.setDescripcion(costoTable.getModel().getValueAt(fila, 0).toString());
                cbp.setPeriodo(columna);
                cbp.eliminar(false);
                actualizarTabla(true);
            }
        }
    }//GEN-LAST:event_eliminarCostoButtonActionPerformed

    private void eliminarBeneficioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarBeneficioButtonActionPerformed
        int fila = beneficioTable.getSelectedRow();
        int columna = beneficioTable.getSelectedColumn();
        if (fila >= 0 && columna > 0) {
            int resp = JOptionPane.showConfirmDialog(null, "¿Realmente desea eliminar el beneficio para el periodo seleccionado?", "Confirmacion de Eliminacion", JOptionPane.YES_NO_OPTION);
            if (resp == JOptionPane.YES_OPTION) {
                CostoBeneficioProyecto cbp = new CostoBeneficioProyecto();
                cbp.setIdProyecto(proyectoActual.getIdProyecto());
                cbp.setDescripcion(beneficioTable.getModel().getValueAt(fila, 0).toString());
                cbp.setPeriodo(columna);
                cbp.eliminar(false);
                actualizarTabla(false);
            }
        }
    }//GEN-LAST:event_eliminarBeneficioButtonActionPerformed

    private void modificarBeneficioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_modificarBeneficioButtonActionPerformed
        System.out.println("" + beneficioTable.getSelectedColumn() + ", " + beneficioTable.getSelectedRow());
        int fila = beneficioTable.getSelectedRow();
        int columna = beneficioTable.getSelectedColumn();
        if (fila >= 0 && columna > 0) {
            nombreBeneficioTextField.setText(beneficioTable.getModel().getValueAt(fila, 0).toString());
            montoBeneficioTextField.setText(beneficioTable.getModel().getValueAt(fila, columna).toString());
            periodoBeneficioSpinner.setValue(columna);
            nombreBeneficioTextField.setEnabled(false);
        }
    }//GEN-LAST:event_modificarBeneficioButtonActionPerformed

    private void modificarCostoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_modificarCostoButtonActionPerformed
        System.out.println("" + costoTable.getSelectedColumn() + ", " + costoTable.getSelectedRow());
        int fila = costoTable.getSelectedRow();
        int columna = costoTable.getSelectedColumn();
        if (fila >= 0 && columna > 0) {
            nombreCostoTextField.setText(costoTable.getModel().getValueAt(fila, 0).toString());
            montoCostoTextField.setText(costoTable.getModel().getValueAt(fila, columna).toString());
            periodoCostoSpinner.setValue(columna);
            nombreCostoTextField.setEnabled(false);
        }
    }//GEN-LAST:event_modificarCostoButtonActionPerformed

    private void eliminarCostoTodosButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarCostoTodosButtonActionPerformed
        int fila = costoTable.getSelectedRow();
        int columna = costoTable.getSelectedColumn();
        if (fila >= 0 && columna > 0) {
            int resp = JOptionPane.showConfirmDialog(null, "¿Realmente desea eliminar el costo para todos los periodos?", "Confirmacion de Eliminacion", JOptionPane.YES_NO_OPTION);
            if (resp == JOptionPane.YES_OPTION) {
                CostoBeneficioProyecto cbp = new CostoBeneficioProyecto();
                cbp.setIdProyecto(proyectoActual.getIdProyecto());
                cbp.setDescripcion(costoTable.getModel().getValueAt(fila, 0).toString());
                cbp.setPeriodo(columna);
                cbp.eliminar(true);
                actualizarTabla(true);
            }
        }
    }//GEN-LAST:event_eliminarCostoTodosButtonActionPerformed

    private void eliminarBeneficioTodosButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarBeneficioTodosButtonActionPerformed
        int fila = beneficioTable.getSelectedRow();
        int columna = beneficioTable.getSelectedColumn();
        if (fila >= 0 && columna > 0) {
            int resp = JOptionPane.showConfirmDialog(null, "¿Realmente desea eliminar el beneficio para todos los periodos?", "Confirmacion de Eliminacion", JOptionPane.YES_NO_OPTION);
            if (resp == JOptionPane.YES_OPTION) {
                CostoBeneficioProyecto cbp = new CostoBeneficioProyecto();
                cbp.setIdProyecto(proyectoActual.getIdProyecto());
                cbp.setDescripcion(beneficioTable.getModel().getValueAt(fila, 0).toString());
                cbp.setPeriodo(columna);
                cbp.eliminar(true);
                actualizarTabla(false);
            }
        }
    }//GEN-LAST:event_eliminarBeneficioTodosButtonActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton agregarBeneficioButton;
    private javax.swing.JButton agregarCostoButton;
    private javax.swing.JCheckBox anualidadBeneficioCheckBox;
    private javax.swing.JCheckBox anualidadCostoCheckBox;
    private db.TableFromSQL beneficioTable;
    private javax.swing.JPanel beneficiosPanel;
    private javax.swing.JButton buscarButton;
    private db.TableFromSQL costoTable;
    private javax.swing.JPanel costosPanel;
    private javax.swing.JButton eliminarBeneficioButton;
    private javax.swing.JButton eliminarBeneficioTodosButton;
    private javax.swing.JButton eliminarCostoButton;
    private javax.swing.JButton eliminarCostoTodosButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JButton limpiarBeneficioButton;
    private javax.swing.JButton limpiarCostoButton;
    private javax.swing.JButton modificarBeneficioButton;
    private javax.swing.JButton modificarCostoButton;
    private javax.swing.JTextField montoBeneficioTextField;
    private validadores.api.ValidadorJTextComponent montoBeneficioValidador;
    private javax.swing.JTextField montoCostoTextField;
    private validadores.api.ValidadorJTextComponent montoCostoValidador;
    private javax.swing.JTextField nombreBeneficioTextField;
    private validadores.api.ValidadorJTextComponent nombreBeneficioValidador;
    private javax.swing.JTextField nombreCostoTextField;
    private validadores.api.ValidadorJTextComponent nombreCostoValidador;
    private javax.swing.JSpinner periodoBeneficioSpinner;
    private javax.swing.JSpinner periodoCostoSpinner;
    private javax.swing.JLabel proyectoSeleccionadoLabel;
    // End of variables declaration//GEN-END:variables

    private class NoEditableTableModel extends DefaultTableModel {

        private NoEditableTableModel(Object[][] datos, Object[] cols) {
            super(datos, cols);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    }
}
